#include <stdlib.h>
#include "st-common.h"

st_vertex_3d    st_mkv3_dump[ST_MAKE_VEX3_SIZE];
st_uint8        st_mkv3_count=0;

st_vertex_3d* st_MakeVertex3(st_sint32 x, st_sint32 y, st_sint32 z)
{
    st_uint8 i;
    i = st_mkv3_count;

    st_mkv3_dump[i].x = x;
    st_mkv3_dump[i].y = y;
    st_mkv3_dump[i].z = z;

    st_mkv3_count++;
    if (st_mkv3_count >= ST_MAKE_VEX3_SIZE)
    {
        st_mkv3_count = 0;
    }

    return(&st_mkv3_dump[i]);
}

/*******************************************************************************
 *      Dynamic Element Supervisor
 ******************************************************************************/
#ifdef ST_SDL_WRAPPER
/* 让SDL来管理动态资源信息 {{{1*/
void*    _st_common_Search(void* ptr);

void st_common_InitDES(void)
{
}
void st_common_FreeDES(void)
{
}

st_boolean    st_Assigned(void* ptr)
{
    st_uint32 i;

    if (ptr != NULL)
    {
        return ST_TRUE;
    }

    return ST_FALSE;
}

void*         st_Allocate(st_uint32 size)
{
    return(SDL_malloc(size));
}

void          st_Free(void* ptr)
{
    SDL_free(ptr);
}

void*    _st_common_Search(void* ptr)
{
    return NULL;
}
/* 让SDL来管理动态资源信息 }}}1*/
#else
/* 自己管理{{{1*/
struct _st_dynamic_element
{
    void* ptr;
    st_uint32 size;
};
struct _st_dynamic_element st_g_DES[ST_MAX_DYNAMIC_ELEMENT_NUM];

void*    _st_common_Search(void* ptr);

void st_common_InitDES(void)
{
    st_uint32 i;
    for (i=0;i<ST_MAX_DYNAMIC_ELEMENT_NUM;i++)
    {
        st_g_DES[i].ptr=NULL;
        st_g_DES[i].size=0;
    }
}
void st_common_FreeDES(void)
{
    st_uint32 i;
    for (i=0;i<ST_MAX_DYNAMIC_ELEMENT_NUM;i++)
    {
        if (st_g_DES[i].ptr != NULL)
        {
            free(st_g_DES[i].ptr);
            st_g_DES[i].ptr=NULL;
            st_g_DES[i].size=0;
        }
    }
}

st_boolean    st_Assigned(void* ptr)
{
    st_uint32 i;

    //if ( _st_common_Search(ptr) != NULL)
    //{
    //    return ST_TRUE;
    //}
    if (ptr != NULL)
    {
        return ST_TRUE;
    }


    return ST_FALSE;
}

void*         st_Allocate(st_uint32 size)
{
    st_uint32 i;
    for (i= 0; i < ST_MAX_DYNAMIC_ELEMENT_NUM; i++) 
    {
        if (st_g_DES[i].ptr == NULL)
        {
            st_g_DES[i].size=size;
            st_g_DES[i].ptr =malloc(size);
            return (st_g_DES[i].ptr);
        }
    }
    return NULL;
}

void          st_Free(void* ptr)
{
    st_uint32 i;
    struct _st_dynamic_element* de;

    if (ptr != NULL)
    {
        de = _st_common_Search(ptr);
        if (de!=NULL)
        {
            free(ptr);
            de->ptr=NULL;
            de->size=0;
        }
    }
}

void*    _st_common_Search(void* ptr)
{
    st_uint32 i;
    if (ptr != NULL)
    {
        for (i=0;i<ST_MAX_DYNAMIC_ELEMENT_NUM;i++)
        {
            if (ptr == st_g_DES[i].ptr)
            {
                return &(st_g_DES[i]);
            }
        }
    }
    return NULL;
}
/* 自己管理}}}1*/
#endif

